package cn.iocoder.yudao.module.energy.service.alert;

import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.energy.controller.admin.alert.vo.*;
import cn.iocoder.yudao.module.energy.controller.admin.statistics.vo.StatisticsRespVO;
import cn.iocoder.yudao.module.energy.dal.dataobject.alert.EnergyAlertDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import java.time.LocalDateTime;

/**
 * 预警 Service 接口
 *
 * @author 芋道源码
 */
public interface AlertService {

    /**
     * 创建预警
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createAlert(@Valid AlertSaveReqVO createReqVO);

    /**
     * 更新预警
     *
     * @param updateReqVO 更新信息
     */
    void updateAlert(@Valid AlertSaveReqVO updateReqVO);

    /**
     * 删除预警
     *
     * @param id 编号
     */
    void deleteAlert(Long id);

    /**
     * 获得预警
     *
     * @param id 编号
     * @return 预警
     */
    EnergyAlertDO getAlert(Long id);

    /**
     * 获得预警分页
     *
     * @param pageReqVO 分页查询
     * @return 预警分页
     */
    PageResult<EnergyAlertDO> getAlertPage(AlertPageReqVO pageReqVO);

    /**
     * 批量创建预警
     *
     * @param alerts 预警列表
     */
    void batchCreateAlerts(List<EnergyAlertDO> alerts);

    /**
     * 获取指定时间范围内的告警数量
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 告警数量
     */
    Long getAlertCount(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取总告警数量
     *
     * @return 总告警数量
     */
    Long getTotalAlertCount();

    /**
     * 获取指定时间范围内各类型预警的数量
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 各类型预警的数量统计，key 为预警类型，value 为数量
     */
    Map<String, Long> getAlertTypeCount(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取指定时间范围内每天各类型预警的数量
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 每天各类型预警的数量统计列表
     */
    List<StatisticsRespVO.DailyAlertTypeCountVO> getDailyAlertTypeCount(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取指定时间范围内按月统计各类型预警的数量
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 每月各类型预警的数量统计列表
     */
    List<StatisticsRespVO.DailyAlertTypeCountVO> getMonthlyAlertTypeCount(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取指定时间范围内每天按告警级别和预警类型分组的预警数量
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 每天按告警级别和预警类型分组的预警数量统计列表
     */
    List<StatisticsRespVO.AlertLevelTypeCountVO> getDailyAlertLevelTypeCount(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取指定时间范围内每天按告警级别和预警类型分组的预警数量（近30天）
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 每天按告警级别和预警类型分组的预警数量统计列表
     */
    List<StatisticsRespVO.AlertLevelTypeCountVO> getMonthlyAlertLevelTypeCount(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取指定时间范围内按月按告警级别和预警类型分组的预警数量
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 按月按告警级别和预警类型分组的预警数量统计列表
     */
    List<StatisticsRespVO.AlertLevelTypeCountVO> getYearlyAlertLevelTypeCount(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取所有按告警级别分组的预警数量
     *
     * @return 按告警级别分组的预警数量统计，key 为告警级别，value 为数量
     */
    Map<String, Long> getAllAlertLevelCount();
    
    /**
     * 获取所有按告警级别和预警类型分组的预警数量
     *
     * @return 按告警级别和预警类型分组的预警数量统计，key 为告警级别，value 为预警类型和数量的映射
     */
    Map<String, Map<String, Long>> getAllAlertLevelTypeCount();
    
    /**
     * 获取所有告警级别为warning的各类型预警数量统计
     *
     * @return 各类型预警数量统计，key 为预警类型，value 为数量
     */
    Map<String, Long> getWarningLevelAlertCount();
    
    /**
     * 获取所有告警级别为danger的各类型预警数量统计
     *
     * @return 各类型预警数量统计，key 为预警类型，value 为数量
     */
    Map<String, Long> getDangerLevelAlertCount();
} 